package org.devocean.groupbuying.service.impl;

import java.util.List;

import org.devocean.groupbuying.dao.VoucherDAO;
import org.devocean.groupbuying.domain.PurchaseItem;
import org.devocean.groupbuying.domain.SerialKey;
import org.devocean.groupbuying.domain.Voucher;
import org.devocean.groupbuying.service.PurchaseItemService;
import org.devocean.groupbuying.service.VoucherService;
import org.devocean.groupbuying.service.mail.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class VoucherServiceImpl implements VoucherService {

	@Autowired
	private VoucherDAO voucherDAO;
	@Autowired
	private PurchaseItemService purchaseItemService;
	@Autowired
	private MailService mailService;

	@Transactional(readOnly = true)
	public Voucher getVoucherById(Integer id) {

		return voucherDAO.findVoucherById(id);
	}

	@Transactional
	public Voucher addOrUpdateVoucher(Voucher voucher) {
		if (voucher.getVoucherID() == null) {
			return voucherDAO.saveVoucher(voucher);
		} else {
			return voucherDAO.updateVoucher(voucher);
		}

	}

	@Transactional
	public void removeVoucher(Integer id) {
		voucherDAO.deleteVoucher(id);
	}

	@Transactional
	public long countVouchers() {

		return voucherDAO.countVoucher();
	}

	@Transactional
	public List<Voucher> getAllVouchers() {
		return voucherDAO.findAllVouchers();
	}

	@Transactional
	public SerialKey getValidSerialKey(Integer VoucherID) {
		return voucherDAO.findValidSerialKey(VoucherID);
	}

	@Transactional
	public void associateVoucher(final PurchaseItem purchaseItem) {
		// get concerned Voucher
		Voucher voucher = purchaseItem.getDiscount().getVoucher();
		for (int i = 0; i < purchaseItem.getQuantity(); i++) {
			// Get a free serial key
			SerialKey key = voucherDAO.findValidSerialKey(purchaseItem
					.getDiscount().getVoucher().getVoucherID());
			// Burn Voucher (reservation)
			key.setValid(false);
			// Associate serial key
			key.setItem(purchaseItem);
			purchaseItem.getSerialKeys().add(key);
		}
		// Update serials by Voucher
		voucherDAO.updateVoucher(voucher);
		// Update the purchase Item
		purchaseItemService.addOrUpdatePurchaseItem(purchaseItem);
	}

	@Transactional
	public void provideVoucher(final PurchaseItem purchaseItem) {
		// send Voucher !
		mailService.sendVoucher(purchaseItem.getPurchase().getCustomer(),
				purchaseItem.getSerialKeys());
	}

	public Voucher getVoucherByDiscountID(Integer DiscountID) {
		return voucherDAO.findVoucherByDiscountID(DiscountID);
	}

	@Transactional
	public void removeSerial(Integer id) {
		voucherDAO.deleteSerial(id);

	}

}
